# 2.1 导入蓝图对象
from flask import g
from flask import request
from flask import session, jsonify

from info import constants
# 用户信息，首页点击排行，信息分类展示
from info.models import User, News, Category
from info.modules.index import index_blue
# # 14.4导包
# from info import redis_store
# 导包 提供模板
from flask import render_template
# 导包上下文
from flask import current_app

from info.utils.common import user_login_data
from info.utils.response_code import RET

# ---------------------------------------------------------------------------
# 首页index /new_list 网页内容
# GET请求
# cid ：分类ID
# page： 当前页码
# per_page: 每页的数量
# 全部选填
@index_blue.route('/news_list')
def get_news_list():

    # 1.获取参数
    cid = request.args.get('cid', 1)
    page = request.args.get('page', 1)
    per_page = request.args.get('per_page', 10)

    # 2.校验参数（int --> 强转类型成功，就说明是数字）
    try:
        cid = int(cid)
        page = int(page)
        per_page = int(per_page)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.PARAMERR, errmsg='参数错误')

    # 3.查询数据（filter（可能有，可能没有）.order_by（时间降序）.paginate(页码，每页的数量，出错是否要返回报错信息））
    # 如果分类ID传入的是1，那么就不需要设置filter
    filter = []
    if cid != 1:
        filter.append(News.category_id == cid)
        # filter.append(News.clicks == 1)

    try:
        # News.quest.filter(News.category_id == cid, News.clicks ==1)
        # *filter可以将 根据 查询参数 产生的 查询条件语句 展开
        paginates = News.query.filter(*filter).order_by(News.create_time.desc()).paginate(page, per_page, False)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='查询数据库错误')

    # 获取需要的数据
    news_model_list = paginates.items  # 新闻模型列表
    total_page = paginates.pages  # 总页数
    current_page = paginates.page  # 当前页面

    # 模型转字典
    news_dict_li = []
    for news in news_model_list:
        news_dict_li.append(news.to_dict())

    # 如果查询到了，可以拼接要显示的相关数据
    data = {
        'news_dict_li': news_dict_li,
        'total_page': total_page,
        'current_page': current_page
    }

    # 4.返回数据,将数据传递给模板
    return jsonify(errno=RET.OK, errmsg='成功OK', data=data)


# ---------------------------------------------------------------------------
# 2.2使用蓝图对象实现路由
# 首页右上角的内容
@index_blue.route('/')
@user_login_data
def index():
    # ---------------------------------------------------------------------------
    # 一/①用户信息
    # 首页右上角内容逻辑显示
    user = g.user

    # ---------------------------------------------------------------------------
    # 二/②点击排行
    # 查询数据库 》 模型列表 》 模型转字典 》 拼接到data中 》处理模板代码
    # 查询数据库& 模型列表
    news_model_list = None
    try:
        news_model_list = News.query.order_by(News.clicks.desc()).limit(constants.CLICK_RANK_MAX_NEWS)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='新闻首页点击排行-查询失败')

    # 模型转字典
    news_dict_li = []

    for news in news_model_list:
        # 判空处理
        if news:
            news_dict_li.append(news.to_dict())

    # ---------------------------------------------------------------------------
    # 三/③新闻分类信息展示 导航栏
    try:
        categories = Category.query.all()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='新闻分类信息-查询失败')

    categories_dict_li = []
    for category in categories:
        categories_dict_li.append(category.to_dict())

    #  如果查询到了，可以拼接要显示的相关数据
    data = {
        'user': user.to_dict() if user else None,
        'news_dict_li': news_dict_li,
        'categories_dict_li': categories_dict_li
    }

    # 将数据传递给模板
    return render_template('news/index.html', data=data)


# 处理浏览器自动访问网站图标的路由
@index_blue.route('/favicon.ico')
def favicon_ico():
    # 使用current_app,发送静态文件（图片，文本，js，html）
    return current_app.send_static_file('news/favicon.ico')




# ---------------------------------------------------------------------------
# 2.2使用蓝图对象实现路由
# @index_blue.route('/')
# def index():

    # 5.1 测试session
    # session['name'] = 'ithaima'

    # 11.4 测试logging
    # logging.debug('this is debug')
    # logging.info('this is info')
    # logging.warning('this is warning')
    # logging.error('this is error')
    # logging.fatal('this is fatal')

    # 12.2应用上下文
    # current_app.logger.error('current error')
    # 12.3忽略文件

    # 14.3 使用redis_store
    # redis_store.set('age', '18')
    #
    # return 'hello world'

